/*
 * JugadorConectado.cpp
 *
 * Author: Grupo Nro.
 */

#include "JugadorConectado.h"
#include "JugadorThreadEnvio.h"
#include "JugadorThreadRecepcion.h"
#include "ServerThread.h"
#include "Partida.h"

JugadorConectado::JugadorConectado(int id, JugadorThreadRecepcion * procesoRecepcion,
		JugadorThreadEnvio * procesoEnvio,
		ServerThread* serverThread) {
	this->procesoEscucha = procesoRecepcion;
	this->procesoEnvio = procesoEnvio;
	idPartida = -1;
	idCampania = -1;
	procesoEnvio->setJugadorConectado(this);
	procesoRecepcion->setJugadorConectado(this);
	this->serverThread = serverThread;
	this->id = id;
}

JugadorConectado::~JugadorConectado() {
	if (procesoEscucha != NULL) {
		delete procesoEscucha;
		procesoEscucha = NULL;
	}
	if (procesoEnvio!= NULL) {
	    delete procesoEnvio;
	    procesoEnvio = NULL;
	}
}

void JugadorConectado::setIdCampania(int idCampania) {
	this->idCampania = idCampania;
}

int JugadorConectado::getIdCampania() {
	return this->idCampania;
}

void JugadorConectado::setIdPartida(int idPartida) {
	this->idPartida = idPartida;
}

void JugadorConectado::setId(int id) {
    this->id = id;
}

int JugadorConectado::getId() {
    return id;
}

void JugadorConectado::start() {
	procesoEscucha->start();
	procesoEnvio->start();
}

int JugadorConectado::getIdPartida() {
	return this->idPartida;
}

void JugadorConectado::enqueueEventMessage(Message m) {
	((JugadorThreadEnvio*) procesoEnvio)->enqueueEventMessage(m);
}

void JugadorConectado::agregarNuevaPartida(Partida* p) {
	idPartida = serverThread->getSiguienteIDPartida();
	p->setId(idPartida);
	idPartida = p->getId();
	serverThread->agregarNuevaPartida(p);
}

std::vector<Campania*> JugadorConectado::getCampanias() {
	return serverThread->getCampanias();
}

vector<Partida*> JugadorConectado::getPartidas() {
	return serverThread->getPartidasExistentes();
}

void JugadorConectado::terminar() {
	Message m;
	m.code = TERMINATE;
	procesoEnvio->stop();
	procesoEnvio->closeConnections();
	procesoEnvio->enqueueEventMessage(m);
	procesoEnvio->join();
	procesoEscucha->stop();
	procesoEscucha->closeConnections();
	procesoEscucha->anounce();
	procesoEscucha->join();
	Partida* partida = serverThread->getPartidaPorID(idPartida);
	if (partida) {
	    partida->interrumpirPartida();
	}
}

Partida* JugadorConectado::getPartidaPorID(int id) {
	return serverThread->getPartidaPorID(id);
}

void JugadorConectado::anunciarATodosJugadores() {
	Partida* p = serverThread->getPartidaPorID(idPartida);
	std::vector<JugadorConectado*>& players = p->getPlayers();
	std::vector<JugadorConectado*>::iterator it;
	for (it=players.begin(); it!=players.end();++it){
		(*it)->anounce();
	}
}

void JugadorConectado::anounce() {
	procesoEscucha->anounce();
}

bool JugadorConectado::solicitarComienzoDePartidaACreadorDePartida() {
	Partida* p = serverThread->getPartidaPorID(idPartida);
	return p->solicitarComienzoDePartidaACreadorDePartida();
}

bool JugadorConectado::solicitarComienzoDePartida() {
	return procesoEscucha->solicitarComienzoDePartidaACliente();
}
